Pass request headers through to agents that implement receive_web_request

Albert Sun 9 年之前
父节点
当前提交
58f6307e2c

+ 3 - 2
app/controllers/web_requests_controller.rb

@@ -24,7 +24,8 @@ class WebRequestsController < ApplicationController
24 24
     if user
25 25
       agent = user.agents.find_by_id(params[:agent_id])
26 26
       if agent
27
-        content, status, content_type = agent.trigger_web_request(params.except(:action, :controller, :agent_id, :user_id, :format), request.method_symbol.to_s, request.format.to_s)
27
+        content, status, content_type = agent.trigger_web_request(params.except(:action, :controller, :agent_id, :user_id, :format), request.method_symbol.to_s, request.format.to_s, request.headers)
28
+
28 29
         if content.is_a?(String)
29 30
           render :text => content, :status => status || 200, :content_type => content_type || 'text/plain'
30 31
         elsif content.is_a?(Hash)
@@ -46,7 +47,7 @@ class WebRequestsController < ApplicationController
46 47
       secret = params[:secret]
47 48
       user.agents.of_type(Agents::UserLocationAgent).each { |agent|
48 49
         if agent.options[:secret] == secret
49
-          agent.trigger_web_request(params.except(:action, :controller, :user_id, :format), request.method_symbol.to_s, request.format.to_s)
50
+          agent.trigger_web_request(params.except(:action, :controller, :user_id, :format), request.method_symbol.to_s, request.format.to_s, request.headers)
50 51
         end
51 52
       }
52 53
       render :text => "ok"

+ 8 - 3
app/models/agent.rb

@@ -95,7 +95,7 @@ class Agent < ActiveRecord::Base
95 95
     false
96 96
   end
97 97
 
98
-  def receive_web_request(params, method, format)
98
+  def receive_web_request(params, method, format, headers={})
99 99
     # Implement me in your subclass of Agent.
100 100
     ["not implemented", 404]
101 101
   end
@@ -149,18 +149,23 @@ class Agent < ActiveRecord::Base
149 149
     end
150 150
   end
151 151
 
152
-  def trigger_web_request(params, method, format)
152
+  def trigger_web_request(params, method, format, headers)
153 153
     if respond_to?(:receive_webhook)
154 154
       Rails.logger.warn "DEPRECATED: The .receive_webhook method is deprecated, please switch your Agent to use .receive_web_request."
155 155
       receive_webhook(params).tap do
156 156
         self.last_web_request_at = Time.now
157 157
         save!
158 158
       end
159
-    else
159
+    elsif method(:receive_web_request).arity == 3
160 160
       receive_web_request(params, method, format).tap do
161 161
         self.last_web_request_at = Time.now
162 162
         save!
163 163
       end
164
+    else
165
+      receive_web_request(params, method, format, headers).tap do
166
+        self.last_web_request_at = Time.now
167
+        save!
168
+      end
164 169
     end
165 170
   end
166 171
 

+ 1 - 1
spec/controllers/web_requests_controller_spec.rb

@@ -5,7 +5,7 @@ describe WebRequestsController do
5 5
     cannot_receive_events!
6 6
     cannot_be_scheduled!
7 7
 
8
-    def receive_web_request(params, method, format)
8
+    def receive_web_request(params, method, format, headers={})
9 9
       if params.delete(:secret) == options[:secret]
10 10
         memory[:web_request_values] = params
11 11
         memory[:web_request_format] = format

+ 22 - 3
spec/models/agent_spec.rb

@@ -729,14 +729,33 @@ describe Agent do
729 729
         @agent.user = users(:bob)
730 730
         @agent.save!
731 731
 
732
+        def @agent.receive_web_request(params, method, format, headers={})
733
+          memory['last_request'] = [params, method, format, headers]
734
+          ['Ok!', 200]
735
+        end
736
+      end
737
+
738
+      it "calls the .receive_web_request hook, updates last_web_request_at, and saves" do
739
+        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html", {})
740
+        expect(@agent.reload.memory['last_request']).to eq([ { "some_param" => "some_value" }, "post", "text/html", {} ])
741
+        expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i)
742
+      end
743
+    end
744
+
745
+    context "when .receive_web_request is defined without headers" do
746
+      before do
747
+        @agent = Agents::WebRequestReceiver.new(:name => "something")
748
+        @agent.user = users(:bob)
749
+        @agent.save!
750
+
732 751
         def @agent.receive_web_request(params, method, format)
733 752
           memory['last_request'] = [params, method, format]
734 753
           ['Ok!', 200]
735 754
         end
736 755
       end
737 756
 
738
-      it "calls the .receive_web_request hook, updates last_web_request_at, and saves" do
739
-        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html")
757
+      it "calls the .trigger_web_request with headers, but they don't get passed to .receive_web_request" do
758
+        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html", {})
740 759
         expect(@agent.reload.memory['last_request']).to eq([ { "some_param" => "some_value" }, "post", "text/html" ])
741 760
         expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i)
742 761
       end
@@ -756,7 +775,7 @@ describe Agent do
756 775
 
757 776
       it "outputs a deprecation warning and calls .receive_webhook with the params" do
758 777
         mock(Rails.logger).warn("DEPRECATED: The .receive_webhook method is deprecated, please switch your Agent to use .receive_web_request.")
759
-        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html")
778
+        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html", {})
760 779
         expect(@agent.reload.memory['last_webhook_request']).to eq({ "some_param" => "some_value" })
761 780
         expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i)
762 781
       end